/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.sistema.gestionuniversitaria.dataLayer;

import com.sistema.gestionuniversitaria.BusinessLayer.Alumno;
import com.sistema.gestionuniversitaria.BusinessLayer.Curso;
import com.sistema.gestionuniversitaria.BusinessLayer.Matricula;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import oracle.jdbc.OracleTypes;

/**
 *
 * @author Max
 */
public class MatriculaData extends BaseData {

    ArrayList<Matricula> listaMatricula;

    public MatriculaData() {
    }

    public ArrayList<Matricula> getAlumnosCurso(String sigla) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        CallableStatement cstmt = null;
        ResultSet resultSet = null;
        listaMatricula = new ArrayList<Matricula>();
        try {
            cstmt = conexion.prepareCall("{?=call BUSCAR_ALUMNOS_CURSO(?)}");
            cstmt.registerOutParameter(1, OracleTypes.CURSOR);
            cstmt.setString(2, sigla);
            cstmt.execute();
            resultSet = (ResultSet) cstmt.getObject(1);
            while (resultSet.next()) {
                Curso curso = new Curso();
                Alumno al = new Alumno();
                Matricula mat = new Matricula();
                al.setCedula(resultSet.getString("cedula"));
                al.setNombre(resultSet.getString("nombre"));
                al.setApellidos(resultSet.getString("apellidos"));
                mat.setNota(resultSet.getFloat("nota"));
                mat.setEstado(resultSet.getString("estado"));
                mat.setAlumno(al);
                mat.setCurso(curso);
                listaMatricula.add(mat);
            }
        } catch (SQLException e) {
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (cstmt != null) {
                    cstmt.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }

        return listaMatricula;
    }

    public void actualizarMatricula(String sigla, String cedula, float nota) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        CallableStatement cstmtActualizarNota = null;
        try {
            cstmtActualizarNota = conexion.prepareCall("{call ACTUALIZAR_NOTA (?,?,?)}");
            cstmtActualizarNota.setFloat(1, nota);
            cstmtActualizarNota.setString(2, cedula);
            cstmtActualizarNota.setString(3, sigla);
            boolean resultado = cstmtActualizarNota.execute();
            if (resultado == true) {
                throw new NoDataException("No se realizo la inserción");
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (cstmtActualizarNota != null) {
                    cstmtActualizarNota.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }
    }

    public boolean verificaCursoMatricula(String cedula, String sigla) throws ExcepcionGlobal, NoDataException, SQLException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }

        CallableStatement cstmt = null;
        ResultSet resultSet = null;
        boolean registrado = false;

        try {
            cstmt = conexion.prepareCall("{?=call VERIFICA_MATRICULA (?,?)}");
            cstmt.registerOutParameter(1, OracleTypes.CURSOR);
            cstmt.setString(2, cedula);
            cstmt.setString(3, sigla);
            cstmt.execute();
            resultSet = (ResultSet) cstmt.getObject(1);

            if (resultSet.next()) {
                registrado = true;
            }
        } catch (SQLException e) {
            throw new ExcepcionGlobal("Datos no validos o nulos");
        }
        cstmt.close();
        resultSet.close();
        desconectar();

        return registrado;
    }
}
